import numpy as np
import matplotlib.pyplot as plt

# 1. 生成模拟数据
np.random.seed(0)
X = np.linspace(0, 10, 50)  # 输入特征
true_slope = 2
true_intercept = 3
noise = np.random.randn(50)  # 正态噪声
y = true_slope * X + true_intercept + noise  # 模拟真实目标值

# 2. 构建线性回归模型（最小二乘法）
# 公式解：theta = (X^T X)^(-1) X^T y
X_b = np.c_[np.ones((50, 1)), X]  # 添加偏置项：变成 [1, x]
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)  # 正规方程解

# 3. 模型预测
X_new = np.linspace(0, 10, 100)
X_new_b = np.c_[np.ones((100, 1)), X_new]
y_pred = X_new_b.dot(theta_best)

# 4. 可视化
plt.scatter(X, y, color='blue', label='训练数据')
plt.plot(X_new, y_pred, color='red', label='预测线')
plt.xlabel('x')
plt.ylabel('y')
plt.title('简单线性回归')
plt.legend()
plt.show()

# 5. 输出学习到的参数
print(f"学到的斜率（w）: {theta_best[1]:.2f}")
print(f"学到的截距（b）: {theta_best[0]:.2f}")
